home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -serious- / programming / e / powerd / source / examples / showtarga.d < prev    next >
Text File  |  2000-01-27  |  2KB  |  87 lines

  1. // This small program shows 24bit only targa files (generated by RayTrace.d)
  2. // It distinguishes if you have AGA or not and shows the image in 16 or 256 grey scale
  3.  
  4. MODULE    'dos/dos','exec/memory','intuition/intuition','intuition/screens','graphics/modeid'
  5.  
  6. ENUM    TARGAFILE
  7.  
  8. PROC main()
  9.     DEF    args:PTR TO LONG,ra
  10.     args:=[NIL]:LONG
  11.     IF ra:=ReadArgs('TARGAFILE/A',args,NIL)
  12.         ShowTarga(args[TARGAFILE])
  13.         FreeArgs(ra)
  14.     ELSE DO PrintFault(IOErr(),'showtarga')
  15. ENDPROC
  16.  
  17. OBJECT BGR
  18.     b:UBYTE,
  19.     g:UBYTE,
  20.     r:UBYTE
  21.  
  22. PROC ShowTarga(name:PTR TO CHAR)
  23.     DEF    f,head[18]:UBYTE,w,h,mem:PTR TO BGR,m:PTR TO BGR,
  24.             screen:PTR TO Screen,window:PTR TO Window,n,vp,d
  25.     IF f:=Open(name,MODE_OLDFILE)
  26.         Read(f,head,18)
  27.         w:=head[12]|head[13]<<8
  28.         h:=head[14]|head[15]<<8
  29.         Seek(f,head[0],OFFSET_CURRENT)
  30.         IF mem:=AllocMem(w*h*3,MEMF_PUBLIC)
  31.             m:=mem
  32.             Read(f,m,w*h*3)
  33.             IF CheckAGA() THEN d:=8 ELSE d:=4
  34.             IF screen:=OpenScreenTags(NIL,
  35.                     SA_Width,w,
  36.                     SA_Height,h,
  37.                     SA_Depth,d,
  38.                     SA_Title,'ShowTarga v0.1 by MarK, 1999',
  39. //                    SA_DisplayID,VGALORESDBL_KEY,
  40.                     TAG_END)
  41.                 IF window:=OpenWindowTags(NIL,
  42.                         WA_Width,w,
  43.                         WA_Height,h,
  44.                         WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_MOUSEBUTTONS,
  45.                         WA_Flags,WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_RMBTRAP,
  46.                         WA_CustomScreen,screen,
  47.                         TAG_END)
  48.                     vp:=ViewPortAddress(window)
  49.                     IF CheckAGA()
  50.                         FOR n:=0 TO 255 DO SetRGB32(vp,n,n<<24,n<<24,n<<24)
  51.                     ELSE
  52.                         FOR n:=0 TO 15 DO SetRGB4(vp,n,n,n,n)
  53.                     ENDIF
  54.                     DEF    x,y
  55.                     FOR y:=0 TO h-1
  56.                         FOR x:=0 TO w-1
  57.                             n:=m.r+m.g+m.b
  58.                             IF CheckAGA()
  59.                                 SetAPen(window.RPort,n/3)
  60.                             ELSE
  61.                                 SetAPen(window.RPort,n/48)
  62.                             ENDIF
  63.                             WritePixel(window.RPort,x,y)
  64.                             m[]++
  65.                         ENDFOR
  66.                     ENDFOR
  67.                     WaitPort(window.UserPort)
  68.                     CloseWindow(window)
  69.                 ELSE DO PrintF('Unable to open window!\n')
  70.                 CloseScreen(screen)
  71.             ELSE DO PrintF('Unable to open screen!\n')
  72.             FreeMem(mem,w*h*3)
  73.         ENDIF
  74.         Close(f)
  75.     ELSE DO PrintFault(IOErr(),'showtarga')
  76. ENDPROC
  77.  
  78. APROC CheckAGA()(BOOL)
  79.     move.w    $dff07c,d0
  80.     cmpi.b    #$f8,d0
  81.     beq.s        .yes
  82.     moveq        #0,d0
  83.     rts
  84. .yes
  85.     moveq        #-1,d0
  86. ENDPROC
  87.